package s_001_Bean_Registered.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import s_001_Bean_Registered.bean.Tmp;

@Configuration
public class ScopeLazyConfig {

    /**
     * @Scope:调整Bean的作用域 ---
     * prototype：多实例：IOC容器启动时不会去调用方法创建对象放在容器中。而是每次获取时才会调用方法创建对象；
     * singleton：单实例（默认值）：IOC容器启动时会调用方法创建对象并放到IOC容器中。以后每次获取就是直接从容器（map.get()）中拿；
     * request：同一次请求创建一个实例；
     * session：同一个session创建一个实例；
     */
    @Scope("singleton")
    @Bean
    public Tmp tmp() {
        return new Tmp();
    }


    /**
     * 懒加载：针对单实例；
     * 单实例bean：默认在容器启动时创建对象，懒加载后在使用(获取)Bean时才创建对象，并初始化；
     * 多实例bean：默认在容器启动时不创建对象。第一次使用(获取)Bean时创建对象，并初始化，对其使用懒加载无意义；
     */
    @Lazy
    @Bean("tmpLazy")
    public Tmp tmpLazy() {
        return new Tmp();
    }
}
